perm filename PIXNIC.SAI[VIS,HPM]10 blob sn#168769 filedate 1975-07-16 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00008 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE
C00003 00003	INTEGER PROCEDURE PFLDIM(STRING FILNAM)
C00007 00004	INTEGER PROCEDURE GETPFL(STRING FILNAM REFERENCE INTEGER PICTURE)
C00012 00005	INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS)
C00014 00006	INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE STRING FILNAM)
C00017 00007	INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC
C00021 00008	DEFINE PCLN=0  comment index of word in a picture file containing
C00023 ENDMK
C⊗;
REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE;
REQUIRE "TVSIX.REL[1,PDQ]" LOAD_MODULE;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE PIXEL(REFERENCE INTEGER PIX; INTEGER I,J);
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);
INTEGER PROCEDURE PFLDIM(STRING FILNAM);
  comment  returns the size of the picture FILNAM on disk.
		used for allocating arrays in preparation for
		actually reading them. Returns 0 on failure.;
   BEGIN
   INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
   INTEGER ARRAY BUF[0:'177];

   STRING PROCEDURE DEV(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      T←"";
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
      END;

   STRING PROCEDURE NAM(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
      END;

   OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
   LOOKUP(10,NAM(FILNAM),XXFLAG);
   IF XXFLAG THEN
      BEGIN
      CLOSE(10);
      RETURN(0);
      END
   ELSE
      BEGIN
      INTEGER K,KK;
      ARRYIN(10,BUF[0],'200); CLOSE(10);
      IF BUF[0]=-1 THEN
         BEGIN
         KK←0;
         FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
         IF KK=0 THEN RETURN(0);
         BYBI←BUF[1];
         LNBY←BUF[6]-BUF[5]+1;
         PCLN←BUF[4]-BUF[3]+1;
         LNWD←BUF[2];
         LNBYA←LNWD*(36%BYBI);
         PCWD←LNWD*PCLN;
         RETURN(12+PCLN+LNBYA+PCWD);
         END
      ELSE
         BEGIN
         BYBI←BUF[2];
         LNBY←BUF[8]-BUF[7]+1;
         PCLN←BUF[6]-BUF[5]+1;
         WDBY←36%BYBI;
         LNWD←(LNBY+WDBY-1)%WDBY;
         LNBYA←LNWD*WDBY;
         PCWD←PCLN*LNWD;
         PCBY←PCLN*LNBY;
         PCBYA←PCLN*LNBYA;
         WDBI←WDBY*BYBI;
         IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN RETURN(0)
         ELSE RETURN(12+PCLN+LNBYA+PCWD);
         END;
      END;
   END;
INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
  comment  read the picture in file FILNAM into area of core whose first
		word is PICTURE. PFLDIM(FILNAM) words are needed.
		Returns picture size of success, 0 on failure.;
   BEGIN
   INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
   INTEGER I,L;
   INTEGER ARRAY BUF[0:'177];

   STRING PROCEDURE DEV(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      T←"";
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
      END;

   STRING PROCEDURE NAM(STRING FILSPEC);
      BEGIN
      STRING S,T;
      INTEGER I;
      S←FILSPEC;
      WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
      RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
      END;

   OPEN(10,DEV(FILNAM),'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
   LOOKUP(10,NAM(FILNAM),XXFLAG);
   IF XXFLAG THEN
       BEGIN
       CLOSE(10);
       RETURN(0);
       END
   ELSE
      BEGIN
      INTEGER K,KK;
      ARRYIN(10,BUF[0],10);
      IF BUF[0]=-1 THEN
         BEGIN
         ARRYIN(10,BUF[10],'200-10);
         KK←0;
         FOR K←18,17,16,15,10,9,8,7 DO IF BUF[K]≠0 THEN KK←K;
         IF KK=0 THEN
            BEGIN
            CLOSE(10);
            RETURN(0);
            END;
         L←LOCATION(PICTURE);
         MEMORY[L+9]←BYBI←BUF[1];
         MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
         MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
         MEMORY[L+7]←WDBY←36%BYBI;
         MEMORY[L+4]←LNWD←BUF[2];
         MEMORY[L+6]←LNBYA←LNWD*WDBY;
         MEMORY[L+1]←PCWD←PCLN*LNWD;
         MEMORY[L+2]←PCBY←PCLN*LNBY;
         MEMORY[L+3]←PCBYA←PCLN*LNBYA;
         MEMORY[L+8]←WDBI←WDBY*BYBI;
         MEMORY[L+10]←12+PCLN+L;
         MAKTAB(PICTURE);
         XXPICLOC←(BUF[KK] LAND '777777)-'200;
         FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
         ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
         CLOSE(10);
         RETURN(12+PCLN+LNBYA+PCWD);
         END
      ELSE
         BEGIN   comment if old hand eye format;
         L←LOCATION(PICTURE);
         MEMORY[L+9]←BYBI←BUF[2];
         MEMORY[L+5]←LNBY←BUF[8]-BUF[7]+1;
         MEMORY[L+0]←PCLN←BUF[6]-BUF[5]+1;
         MEMORY[L+7]←WDBY←36%BYBI;
         MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
         MEMORY[L+6]←LNBYA←LNWD*WDBY;
         MEMORY[L+1]←PCWD←PCLN*LNWD;
         MEMORY[L+2]←PCBY←PCLN*LNBY;
         MEMORY[L+3]←PCBYA←PCLN*LNBYA;
         MEMORY[L+8]←WDBI←WDBY*BYBI;
         MEMORY[L+10]←12+PCLN+L;
         IF BYBI≤0 ∨ BYBI>36 ∨ LNBY≤0 ∨ PCLN≤0 ∨ BUF[0]<0 THEN
            BEGIN
            CLOSE(10);
            RETURN(0);
            END;
         MAKTAB(PICTURE);
         ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
         CLOSE(10);
         RETURN(12+PCLN+LNBYA+PCWD);
         END;
      END;
   END;
INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
  comment  returns the size of the array needed to hold a hypothetical
		picture HEIGHT scanlines by WIDTH pixels per scanline
		by BITS bits per pixel.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 BYBI←BITS;
 LNBY←WIDTH;
 PCLN←HEIGHT;
 WDBY←36%BYBI;
 LNWD←(LNBY+WDBY-1)%WDBY;
 LNBYA←LNWD*WDBY;
 PCWD←PCLN*LNWD;
 RETURN(12+PCLN+LNBYA+PCWD);
 END;

INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
  comment  actually creates an empty picture HEIGHT by WIDTH by BITS in
		the area of core beginning with PICTURE. Returns its size.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 L←LOCATION(PICTURE);
 MEMORY[L+9]←BYBI←BITS;
 MEMORY[L+5]←LNBY←WIDTH;
 MEMORY[L+0]←PCLN←HEIGHT;
 MEMORY[L+7]←WDBY←36%BYBI;
 MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
 MEMORY[L+6]←LNBYA←LNWD*WDBY;
 MEMORY[L+1]←PCWD←PCLN*LNWD;
 MEMORY[L+2]←PCBY←PCLN*LNBY;
 MEMORY[L+3]←PCBYA←PCLN*LNBYA;
 MEMORY[L+8]←WDBI←WDBY*BYBI;
 MEMORY[L+10]←12+PCLN+L;
 MAKTAB(PICTURE);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;
 
INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
  comment  write out the picture in the core area starting with
		PICTURE, creating a file called FILNAM. Returns
		the size of the original file on success, else 0.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];

 STRING PROCEDURE DEV(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    T←"";
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←T&LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN T ELSE "DSK");
    END;

 STRING PROCEDURE NAM(STRING FILSPEC);
    BEGIN
    STRING S,T;
    INTEGER I;
    S←FILSPEC;
    WHILE LENGTH(S)>0 ∧ S[1 TO 1]≠":" DO T←LOP(S);
    RETURN(IF S[1 TO 1]=":" THEN S[2 TO ∞] ELSE FILSPEC);
    END;

 OPEN(10,DEV(FILNAM),'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
 ENTER(10,NAM(FILNAM),XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  L←LOCATION(PICTURE);
  BUF[0]←-1;
  BUF[1]←BYBI←MEMORY[L+9];
  BUF[2]←LNWD←MEMORY[L+4];
  BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
  BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
  BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
  WDBY←36%BYBI;
  LNWD←(LNBY+WDBY-1)%WDBY;
  LNBYA←LNWD*WDBY;
  ARRYOUT(10,BUF[0],'200);
  ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE CAMPIX(INTEGER CAMRA,YEDGE,XEDGE,SUMS,CLPINC;
					REFERENCE INTEGER PICTURE);
    comment  read a picture from camera CAMRA of size defined by array PICTURE
                  the area of core beginning with PICTURE. Upper left hand
                  corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
   BEGIN
   INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI,LINTAB;
   INTEGER L,CAM;
   EXTERNAL INTEGER ERROR,TVCAM;

   IF CAMRA>'40 THEN CAMRA←CAMRA LAND '67;
   IF CAMRA='41∨CAMRA='42 THEN CAM←CAMRA LAND 3 ELSE
      BEGIN
      INTEGER I,J;
      I←'401400000000 LOR LOCATION(J);
      J←IF CAMRA≥'40 THEN CAMRA LAND 7 ELSE 1 LSH (35-CAMRA);
         START_CODE
            MOVE    1,I;
            CALLI   1,'400070;       COMMENT VDSMAP;
            JUMP    0,0;
         END;
      CAM←3;
      END;

   L←LOCATION(PICTURE);
   PCLN←MEMORY[L+0];
   PCWD←MEMORY[L+1];
   LNWD←MEMORY[L+4];
   LNBY←MEMORY[L+5];
   LNBYA←MEMORY[L+6];
   BYBI←MEMORY[L+9];
   LINTAB←MEMORY[L+11];

   ERROR←1; TVCAM←CAM;

   IF SUMS>1 ∨ CLPINC<8 ∨ BYBI≠4 THEN
      BEGIN
     comment  use Quam's general picture taker;
      EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
      EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
      DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
          SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
          comment  for interfacing quam internal format;
      INTEGER ARRAY PIC[0:15];
      PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
      PIC[BIT]←BYBI;
      PIC[SIZEX]←LNBY;
      PIC[SIZEY]←PCLN;
      PIC[SIZEL]←LNWD;
      TVSIX(PIC,SUMS,CLPINC);
      ARRBLT(MEMORY[LINTAB],MEMORY[PIC[PTR] LAND '777777],PCWD);
      PICREL(PIC);
      END
   ELSE
      BEGIN
      EXTERNAL PROCEDURE TVIN;
      EXTERNAL INTEGER BCLIP,TCLIP,FLINE,LLINE,LSIDE,RSIDE,TVWORD;
      BCLIP←7; TCLIP←0;
      FLINE←YEDGE; LLINE←FLINE+PCLN-1;
      LSIDE←XEDGE; RSIDE←LSIDE+LNBY-1;
      TVWORD←((-PCWD) LSH 18) LOR (LINTAB-1);
      TVIN;
      END;
   RETURN(12+PCLN+LNBYA+PCWD);
   END;
DEFINE PCLN=0;  comment index of word in a picture file containing
			number of scanlines in the picture;
DEFINE PCWD=1;	comment number of words in the picture;
DEFINE PCBY=2;	comment number of valid bytes in the picture;
DEFINE PCBYA=3;	comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4;	comment no. of words per scanline;
DEFINE LNBY=5;	comment no. of valid bytes per scanline;
DEFINE LNBYA=6;	comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7;	comment no. of bytes per word;
DEFINE WDBI=8;	comment no. of bits containing data in a word;
DEFINE BYBI=9;	comment no. of bits per byte;
DEFINE BPTAB=10; comment address of second entry in byte pntr. table;
DEFINE LINTAB=11; comment actual address of the first entry in the row table;